package br.com.advocacia.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.advocacia.entidade.Bairro;
import br.com.advocacia.entidade.Cidade;
import br.com.advocacia.entidade.Comarca;
import br.com.advocacia.entidade.Estado;
import br.com.advocacia.entidade.Foro;
import br.com.advocacia.entidade.Instancia;
import br.com.advocacia.logica.contract.BairroLogicaContract;
import br.com.advocacia.logica.contract.CidadeLogicaContract;
import br.com.advocacia.logica.contract.DefaultLogicaContract;
import br.com.advocacia.util.FacesUtil;
import br.com.advocacia.util.StringUtil;

@ManagedBean(name="foroFaces")
@ViewScoped
public class ForoFaces extends FacesUtil {
	
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Foro> logicaForo;
	
	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Comarca> logicaComarca;
	
	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Instancia> logicaInstancia;
	
	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Estado> logicaEstado;
	
	@ManagedProperty(value = "#{cidadeLogica}")
	private CidadeLogicaContract logicaCidade;
	
	@ManagedProperty(value = "#{bairroLogica}")
	private BairroLogicaContract logicaBairro;
	
	
	private Foro foro = new Foro();
	private List<Foro> listaForo = new ArrayList<>();
	
	private List<Estado> listaEstado = new ArrayList<>();
	private Long idEstadoSelecionado;
	
	private List<Cidade> listaCidade = new ArrayList<>();
	private Long idCidadeSelecionado;
	
	private List<Bairro> listaBairro = new ArrayList<>();
	private Long idBairroSelecionado;

	private List<Instancia> listaInstancia = new ArrayList<>();
	private Long idInstanciaSelecionado;
	
	private List<Comarca> listaComarca = new ArrayList<>();
	private Long idComarcaSelecionado;
	
	
	/** CAMPOS DE PESQUISA */
	private String nomeForo;
	
	@PostConstruct
	public void init() {
		this.popularComboEstado();
		this.popularComboComarca();
		this.popularComboInstancia();
	}
	
	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaForo.adicionar(foro);
				adicionarMensagem("Foro adicionado com sucesso");
				this.buscarForo();
				fecharModal("dialogForo");
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar o Foro");
		}
	}
	
	public void prepararAdicionar() {
		this.foro = new Foro();
		abrirModal("dialogForo");
	}
	
	public void selecionarRegistro(Long idForo, boolean editar) {
		try {
			this.foro = logicaForo.obterPorId(Foro.class, idForo);
			this.popularIdsRelacionamento();
			if (editar) {
				abrirModal("dialogForo");
			} else {
				abrirModal("dialogExcluir");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void editar() {
		try {
			if (validaCampos()) {
				logicaForo.editar(this.foro);
				adicionarMensagem("Foro editado com sucesso");
				fecharModal("dialogForo");
				this.buscarForo();
			} else {
				return;
			}
			
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar o Foro");
		}
	}
	
	public void remover() {
		try {
			logicaForo.remover(Foro.class, this.foro.getId());
			adicionarMensagem("Foro removido com sucesso");
			fecharModal("dialogExcluir");
			this.buscarForo();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover o Foro");
		}
	}
	
	public void buscarForo() {
		if (listaForo != null) {
			this.listaForo.clear();
		}
		
		try {
			if (!StringUtil.textoPreenchido(nomeForo)) {
				this.listaForo =  logicaForo.buscarTodos(Foro.class, "nome");
			} else {
				this.listaForo = logicaForo.buscarPorCampo(Foro.class, "nome", nomeForo);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;
		this.popularRelacionamentos();
		
		if (!StringUtil.textoPreenchido(this.foro.getNome())) {
			adicionarMensagem("O campo nome é obrigatório");
			valido = false;
		}
		return valido;
	}
	
	public void popularComboEstado() {
		if (listaEstado != null) {
			listaEstado.clear();
		}
		
		try {
			this.listaEstado = logicaEstado.buscarTodos(Estado.class, "nomeEstado");
		} catch (Exception e) {
			System.out.println("Erro ao buscar os Estados");
		}
	}
	
	public void popularComboComarca() {
		if (listaComarca != null) {
			listaComarca.clear();
		}
		
		try {
			this.listaComarca = logicaComarca.buscarTodos(Comarca.class, "numeroComarca");
		} catch (Exception e) {
			System.out.println("Erro ao buscar as Comarcas");
		}
	}
	
	public void popularComboInstancia() {
		if (listaInstancia != null) {
			listaInstancia.clear();
		}
		
		try {
			this.listaInstancia = logicaInstancia.buscarTodos(Instancia.class, "instancia");
		} catch (Exception e) {
			System.out.println("Erro ao buscar os Instancias");
		}
	}
	
	public void popularComboCidade() {
		if (idEstadoSelecionado != null && idEstadoSelecionado != 0) {
			this.listaCidade = logicaCidade.buscarCidadesPorEstado(idEstadoSelecionado, "");
		}
	}
	
	public void popularComboBairro() {
		if (idCidadeSelecionado != null && idCidadeSelecionado != 0) {
			this.listaBairro = logicaBairro.buscarBairrosPorCidade(idCidadeSelecionado, "");
		}
	}

	
	public void popularRelacionamentos() {
		try {
			this.foro.setEstado(logicaEstado.obterPorId(Estado.class,	idEstadoSelecionado));
			this.foro.setCidade(logicaCidade.obterPorId(Cidade.class,   idCidadeSelecionado));
			this.foro.setBairro(logicaBairro.obterPorId(Bairro.class,	idBairroSelecionado));

			this.foro.setComarca(logicaComarca.obterPorId(Comarca.class,	idComarcaSelecionado));
			this.foro.setInstancia(logicaInstancia.obterPorId(Instancia.class,	idInstanciaSelecionado));
		} catch (Exception e) {
			System.out.println("Erro ao popular o objeto Foro");
		}
	}	
	
	public void popularIdsRelacionamento() {
		this.idEstadoSelecionado = this.foro.getEstado().getId();
		this.popularComboCidade();
		this.idCidadeSelecionado = this.foro.getCidade().getId();
		this.popularComboBairro();
		this.idBairroSelecionado = this.foro.getBairro().getId();
		this.idComarcaSelecionado = this.foro.getComarca().getId();
		this.popularComboComarca();
		this.idInstanciaSelecionado = this.foro.getInstancia().getId();
		this.popularComboInstancia();
	}

	public Foro getForo() {
		return foro;
	}

	public void setForo(Foro foro) {
		this.foro = foro;
	}

	public List<Foro> getListaForo() {
		return listaForo;
	}

	public void setListaForo(List<Foro> listaForo) {
		this.listaForo = listaForo;
	}

	public List<Estado> getListaEstado() {
		return listaEstado;
	}

	public void setListaEstado(List<Estado> listaEstado) {
		this.listaEstado = listaEstado;
	}

	public String getNomeForo() {
		return nomeForo;
	}

	public void setNomeForo(String nomeForo) {
		this.nomeForo = nomeForo;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public void setLogicaForo(DefaultLogicaContract<Foro> logicaForo) {
		this.logicaForo = logicaForo;
	}

	public void setLogicaEstado(DefaultLogicaContract<Estado> logicaEstado) {
		this.logicaEstado = logicaEstado;
	}

	public Long getIdEstadoSelecionado() {
		return idEstadoSelecionado;
	}

	public void setIdEstadoSelecionado(Long idEstadoSelecionado) {
		this.idEstadoSelecionado = idEstadoSelecionado;
	}

	public List<Cidade> getListaCidade() {
		return listaCidade;
	}

	public void setListaCidade(List<Cidade> listaCidade) {
		this.listaCidade = listaCidade;
	}

	public Long getIdCidadeSelecionado() {
		return idCidadeSelecionado;
	}

	public void setIdCidadeSelecionado(Long idCidadeSelecionado) {
		this.idCidadeSelecionado = idCidadeSelecionado;
	}

	public List<Bairro> getListaBairro() {
		return listaBairro;
	}

	public void setListaBairro(List<Bairro> listaBairro) {
		this.listaBairro = listaBairro;
	}

	public Long getIdBairroSelecionado() {
		return idBairroSelecionado;
	}

	public void setIdBairroSelecionado(Long idBairroSelecionado) {
		this.idBairroSelecionado = idBairroSelecionado;
	}

	public void setLogicaCidade(CidadeLogicaContract logicaCidade) {
		this.logicaCidade = logicaCidade;
	}

	public void setLogicaBairro(BairroLogicaContract logicaBairro) {
		this.logicaBairro = logicaBairro;
	}

	public List<Instancia> getListaInstancia() {
		return listaInstancia;
	}

	public void setListaInstancia(List<Instancia> listaInstancia) {
		this.listaInstancia = listaInstancia;
	}

	public Long getIdInstanciaSelecionado() {
		return idInstanciaSelecionado;
	}

	public void setIdInstanciaSelecionado(Long idInstanciaSelecionado) {
		this.idInstanciaSelecionado = idInstanciaSelecionado;
	}

	public List<Comarca> getListaComarca() {
		return listaComarca;
	}

	public void setListaComarca(List<Comarca> listaComarca) {
		this.listaComarca = listaComarca;
	}

	public Long getIdComarcaSelecionado() {
		return idComarcaSelecionado;
	}

	public void setIdComarcaSelecionado(Long idComarcaSelecionado) {
		this.idComarcaSelecionado = idComarcaSelecionado;
	}

	public void setLogicaComarca(DefaultLogicaContract<Comarca> logicaComarca) {
		this.logicaComarca = logicaComarca;
	}

	public void setLogicaInstancia(DefaultLogicaContract<Instancia> logicaInstancia) {
		this.logicaInstancia = logicaInstancia;
	}
	
	
}